home *** CD-ROM | disk | FTP | other *** search
- ; FILE: Source:modules/SpeedyChip.ASM REV: 2 --- Patch 060 MMU list for faster chipmem write
-
- ;
- ; SpeedyChip module for BlizKick
- ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ; SpeedyChip module patches 060 MMU list speeding up chip memory
- ; writes.
- ;
- ; This module does the same thing as speedychip
- ; (Aminet: util/boot/speedychip.lha) by Harry Sintonen (that's me!-)
- ;
- ; NOTE: If you have V42+ 68060.library you don't need this module.
- ;
- ; Written by Harry Sintonen.
- ; This source code is Public Domain.
- ;
- ;
-
- incdir "include:"
- include "exec/libraries.i" ; Some required...
- include "exec/memory.i"
- include "exec/execbase.i"
- include "exec/exec_lib.i"
- include "blizkickmodule.i"
-
- SECTION MODULE,CODE
- _DUMMY_LABEL
- BK_MOD BKMF_SingleMode,_end,(RTF_AFTERDOS)<<24!37<<16!NT_UNKNOWN<<8!(256-110),_name,_idstr,_init
-
- ; Singlemode on,
- ; AFTERDOS module, requires KS V37.x or better, module type NT_UNKNOWN, priority -110.
- ; -> after ramlib (ramlib patches OpenLibrary).
-
- _init movem.l d0-d1/a0-a2/a6,-(sp)
- move.l (4).w,a6
- btst #AFB_68040,(AttnFlags+1,a6) ; Test for 040+
- beq.b .exit
-
- move.l #PATCH_LEN+4,d0 ; get memory for patch
- moveq #MEMF_PUBLIC,d1
- jsr (_LVOAllocMem,a6)
- tst.l d0
- beq .exit
- move.l d0,a2
-
- lea (Patch,pc),a0 ; copy patch code
- lea (4,a2),a1
- move.l #PATCH_LEN,d0
- jsr (_LVOCopyMem,a6)
-
- jsr (_LVOForbid,a6) ; install patch
- move.l a2,d0
- addq.l #4,d0
- move.w #_LVOOpenLibrary,a0
- move.l a6,a1
- jsr (_LVOSetFunction,a6)
- move.l d0,(a2)
- jsr (_LVOCacheClearU,a6)
- jsr (_LVOPermit,a6)
-
- .exit movem.l (sp)+,d0-d1/a0-a2/a6
- rts
-
- Patch
- .origol EQU *-4
- move.l (.origol,pc),a0
- cmp.l #'6804',(a1) ; match for '68040.library'
- bne.b .orig
- cmp.l #'0.li',(4,a1)
- bne.b .orig
- cmp.l #'brar',(8,a1)
- bne.b .orig
- cmp.w #'y'<<8,(12,a1)
- bne.b .orig
-
- jsr (a0) ; try opening it
- move.l d0,-(sp) ; if opened 060 flag & MMU
- beq.b .exit ; should be initialized ok.
-
- tst.b (AttnFlags+1,a6) ; test for 060
- bmi.b .has_060
-
- .exit move.l (sp)+,d0
- rts
- .orig jmp (a0)
-
- .has_060 move.l a5,a0 ; get MMU control register
- lea (.gettcr,pc),a5
- jsr (_LVOSupervisor,a6)
- tst.w d0 ; test bit 15 E - Enable
- bpl.b .exit
- btst #14,d0 ; P - Page Size
- bne.b .exit ; Must have 4k page size
-
- movem.l d2-d3/a4-a5,-(sp) ; store some regs
- jsr (_LVODisable,a6) ; no others messing around, please...
-
- lea (Patch,pc),a5 ; remove (or disable) patch:
- move.w #_LVOOpenLibrary,a0
- cmp.l 2(a6,a0.w),a5
- bne.b .cant_rem
- move.l -(a5),d0
- move.l a6,a1
- jsr (_LVOSetFunction,a6)
- bra.b .was_remd
- .cant_rem move.w #$4ED0,(4,a5) ; disable patch
- jsr (_LVOCacheClearU,a6)
- .was_remd
- lea (.geturp,pc),a5 ; get MMU list root table
- jsr (_LVOSupervisor,a6)
- move.l d0,a0 ; a0=array of 128 root-level table descriptors, 32mb each
-
- move.l (a0),d0 ; get first pointer table
- and.w #$FE00,d0
- move.l d0,a4 ; a4=array of 128 pointer table descriptors, 256k each
-
- moveq #8-1,d3 ; Patch all page desciptors of first 8 table
- .mloop move.l (a4)+,d0 ; descriptors (8*256k=2mb=size of chipmem)
- and.w #$FE00,d0
- move.l d0,a0 ; a0=array of 64 page descriptors
- moveq #64-1,d1
- .ploop move.l (a0),d2
- move.l d2,d0
- and.b #%11,d0 ; get PDT
- beq.b .next ; 00=invalid
- cmp.b #%10,d0 ; 10=indirect
- beq.b .next
-
- ; ok this is really it:
- or.b #%1100000,d2 ; set cm (bits 5&6) to 11 (Cache-Inhibited, Imprecise exception model)
- move.l d2,(a0)
-
- .next addq.l #4,a0
- dbf d1,.ploop
- dbf d3,.mloop
-
- lea (.flush,pc),a5 ; flush ATC & caches
- jsr (_LVOSupervisor,a6)
- jsr (_LVOCacheClearU,a6) ; flush caches with OS too (just to be sure:)
- jsr (_LVOEnable,a6) ; and back...
- movem.l (sp)+,d2-d3/a4-a5 ; pop registers
- move.l (sp)+,d0 ; pop OpenLibrary() result.
- rts
-
- .gettcr move.l a0,a5
- dc.l $4E7A0003 ;movec tc,d0
- nop
- rte
-
- .geturp dc.l $4E7A0806 ;movec urp,d0
- nop
- rte
-
- .flush dc.w $F518 ; PFLUSHA flush the address translation cache
- dc.w $F4F8 ; CPUSHA BC flush the caches into memory
- dc.w $F4D8 ; INVA BC invalidate the data and inst caches
- nop
- rte
-
-
- PATCH_LEN EQU *-Patch
-
- _name dc.b 'SpeedyChip',0
- _idstr dc.b 'SpeedyChip 1.1 (3.12.97)',0
- CNOP 0,2
- _end
-
- SECTION VERSION,DATA
-
- dc.b '$VER: SpeedyChip_MODULE 1.1 (3.12.97)',0
-
-